package com.atguigu.spzx.manager.helper;

import com.atguigu.spzx.model.entity.system.SysMenu;

import java.util.ArrayList;
import java.util.List;

/**
 * ClassName: MenuHepler
 * Package: com.atguigu.spzx.manager.helper
 * Description:
 *
 * @Author 刘强
 * @Create 2024/7/3 11:05
 * @Version 1.0
 */
public class MenuHelper {
    /**
     * 将菜单列表转换为树形结构
     *      思路：遍历所有菜单，如果parentId = 0 则为一级菜单，应该添加到返回值的list中，但是添加之前，我们应该查询他的所有子节点；
     *          查询他的所有子节点： 遍历所有菜单，根据当前菜单的id和正在遍历的菜单的parentId比较，如果相同，则应该添加到返回值的list中，
     *          我们应该查询他的所有子节点。 ----> 递归
     * @param sysMenuList
     * @return
     */
    public static List<SysMenu> buildTree(List<SysMenu> sysMenuList) {
        ArrayList<SysMenu> sysMenuListTree = new ArrayList<>();
        for (SysMenu sysMenu : sysMenuList) {
            // 判断是否是一级菜单
            if(sysMenu.getParentId().intValue() == 0){
                // 查询一级菜单的所有子节点
                sysMenu.setChildren(findChildren(sysMenu,sysMenuList));
                // 添加到返回值集合中
                sysMenuListTree.add(sysMenu);
            }
        }
        return sysMenuListTree;
    }

    /**
     * 查询当前id的菜单的所有子节点
     * @param sysMenuParent
     * @param sysMenuList
     * @return
     */
    private static List<SysMenu> findChildren(SysMenu sysMenuParent, List<SysMenu> sysMenuList) {
        // 当前id的菜单的children属性
        ArrayList<SysMenu> children = new ArrayList<>();

        for (SysMenu sysMenu : sysMenuList) {
            // 判断当前菜单是否是子菜单
            if(sysMenu.getParentId().intValue() == sysMenuParent.getId()){
                // 如果是子菜单则应该添加到当前菜单的children属性中，但之前应该查询该子菜单的所有子菜单
                sysMenu.setChildren(findChildren(sysMenu, sysMenuList));
                children.add(sysMenu);
            }
        }

        return children;
    }



}
